package cn.cxyxj.study03;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity  //如果你的项目是 SpringBoot 项目，该注解就没必要写
@EnableGlobalMethodSecurity(jsr250Enabled = true,securedEnabled = true,prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("cxyxj")
                .password("123").roles("admin", "user")
                .and()
                .withUser("security")
                .password("security").roles("user");

     //   auth.userDetailsService(userDetailsService());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      /*  http.authorizeRequests()  //开启配置
                .antMatchers("/cxyxj/**").hasRole("admin")   //访问/cxyxj/**下的路径，必须具备admin身份
                .antMatchers("/security/**").hasRole("user") //访问/security/**下的路径，必须具备user身份
                .antMatchers("/permitAll").permitAll() // 访问/permitAll路径，不需要登录
                .anyRequest() //其他请求
                .authenticated()//验证   表示其他请求只需要登录就能访问
                .and()
                .formLogin(); // 开启表单登陆*/

// Web 授权
//        http.formLogin();
//        http.authorizeRequests()
//                .antMatchers("/permitAll").permitAll() // 访问/permitAll路径，不需要认证
//                // 访问 /cxyxj/** 路径，任意目录下 .js 文件 可以直接访问
//                .antMatchers("/cxyxj/**","/**/*.js").permitAll()
//                //所有以.js 结尾的文件都被放行
//                .regexMatchers( ".+[.]js").permitAll()
//                .mvcMatchers("/cxyxj/**").servletPath("/role").permitAll()
//                .anyRequest()   //其他请求
//                .authenticated(); //需要认证才能访问


        //内置操作
        http.formLogin();
        http.authorizeRequests()
                // 如果用户具备 admin 权限，就允许访问。
                .antMatchers("/cxyxj/**").hasAuthority("ROLE_admin")
// 如果用户具备给定权限中某一个，就允许访问。
                .antMatchers("/admin/demo").hasAnyAuthority("ROLE_admin", "ROLE_System")
// 如果用户具备 user 权限，就允许访问。注意不需要手动写 ROLE_ 前缀，写了会报错
                .antMatchers("/security/**").hasRole("user")
//如果请求是指定的 IP 就允许访问。
                .antMatchers("/admin/demo").hasIpAddress("192.168.64.5")
                .anyRequest()   //其他请求
                .authenticated(); //需要认证才能访问

        // 自定义方法
//        http.authorizeRequests()  //开启配置
//                .antMatchers("/permitAll").permitAll()  // 访问/permitAll路径，不需要登录
//                .anyRequest().access("@myAccess.hasPermit(request,authentication)")
//                //.anyRequest() //其他请求
//                //.authenticated()//验证   表示其他请求只需要登录就能访问
//                .and()
//                .formLogin();

        // 方法授权
       // http.formLogin();
    }

}
